package com.pikaqiu.warehouse.utils;

import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.pikaqiu.warehouse.exception.MiniServiceException;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;

/**
 * 微信支付工具类
 *
 * @Author: pikaqiu
 * @Date: 2024/6/3
 */
@Slf4j
public class WeChatUtils {


    /**
     * 小程序app_id
     */
    private static final String APP_ID = "wxb758575e17d79dbd";

    /**
     * 小程序app_secret
     */
    private static final String APP_SECRET = "4a8f56f9cc31d4b706717297e05e5d53";

    /**
     * 公众号app_id
     */
    private static final String PUBLIC_TOKEN = "19940420";

    /**
     * 公众号app_id
     */
    public static final String PUBLIC_APP_ID = "wxfd814d6a6e1f5a89";

    /**
     * 公众号app_secret
     */
    private static final String PUBLIC_APP_SECRET = "8127f45a627ae05ae3277917b84605f5";

    /**
     * 公众号解密秘钥
     */
    private static final String PUBLIC_AES_KEY = "zbNmXjxAaSbxEd6yrwgEZGtw20dhyFlEl8hL5Hto5DS";

    /**
     * 小程序登录接口地址
     */
    private static final String CODE_TO_SESSION = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";

    /**
     * 获取access_token 该access_token用于调用其他接口
     */
    private static final String URL_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";   /**

     /**
     * 获取jsapi_ticket
     */
    private static final String URL_JSAPI_TICKET = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";

    /** 获取code
     * APPID 公众号的唯一标识
     * REDIRECT_URI 授权后重定向的回调链接地址， 请使用 urlEncode 对链接进行处理
     * SCOPE 应用授权作用域，snsapi_base （不弹出授权页面，直接跳转，只能获取用户openid），snsapi_userinfo （弹出授权页面，可通过openid拿到昵称、性别、所在地。并且， 即使在未关注的情况下，只要用户授权，也能获取其信息 ）
     * STATE 重定向后会带上state参数，开发者可以填写a-zA-Z0-9的参数值，最多128字节
     */
    public static final String URL_OAUTH2_AUTHRIZE = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE&connect_redirect=1#wechat_redirect";



    /**
     * 小程序登陆
     * @param code 小程序登陆code
     * @return 用户openId
     */
    public static JSONObject code2Session(String code) {
        String url = String.format(CODE_TO_SESSION, APP_ID, APP_SECRET, code);
        String result = HttpUtil.get(url);
        log.info("微信小程序登录返回参数：{}", result);
        JSONObject jsonObject = JSON.parseObject(result);
        if (jsonObject.containsKey("errcode")) {
            log.error("微信小程序登录失败：{}", jsonObject.getString("errmsg"));
            throw new MiniServiceException("登录失败");
        }
        return jsonObject;
    }

    /**
     * 获取基础access_token
     */
    public static JSONObject getAccessToken() {
        String url = URL_TOKEN.replaceAll("APPID", APP_ID);
        url = url.replaceAll("SECRET", APP_SECRET);
        String content = HttpUtil.get(url);
        JSONObject jsonObject = JSONObject.parseObject(content);
        log.info("重新获取access_token结果：" + jsonObject);
        return jsonObject;
    }

    /**
     * 将请求参数转换为xml格式的string
     */
    public static String getRequestXml(SortedMap<Object, Object> parameters) {
        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        Set<Map.Entry<Object, Object>> es = parameters.entrySet();
        for (Map.Entry<Object, Object> entry : es) {
            String k = (String) entry.getKey();
            String v = entry.getValue() + "";
            if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {
                sb.append("<").append(k).append(">").append("<![CDATA[").append(v).append("]]></").append(k).append(">");
            } else {
                sb.append("<").append(k).append(">").append(v).append("</").append(k).append(">");
            }
        }
        sb.append("</xml>");
        return sb.toString();
    }

}
